/*************************************************************************
	> File Name: oj-399_xm_eat.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年11月18日 星期三 18时09分30秒
 ************************************************************************/

#include <iostream>
#include <queue>

struct node {
    int x, y, step;
};

int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
char mmap[505][505];

using namespace std;

int main() {
    int n, m;
    queue<node> que;
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> mmap[i][j];
            if (mmap[i][j] == '2') {
                que.push((node){i, j, 0});
            }
        }
    }
    while (!que.empty()) {
        node temp = que.front();
        que.pop();
        //朝四个方向广搜
        for (int i = 0; i < 4; ++i) {
            int x = temp.x + dir[i][0];
            int y = temp.y + dir[i][1];
            //遇到终点，则返回当前step+1
            if (mmap[x][y] == '3') {
                cout << temp.step + 1 << endl;
                return 0;
            }
            if (mmap[x][y] == '.') {
                //如果可以走，先标记一下防止回头
                mmap[x][y] = 0;
                que.push((node){x, y, temp.step + 1});
            }
        }
    }
    cout << -1 << endl;
    return 0;
}
